hhkb
컴퓨터과학

어셈블리_01_어셈블리 개발 환경과 빌드 프로세스

작성자 : Heehyeon Yoo|2025-10-06
# Assembly# Linux# NASM# GCC# GDB

어셈블리어 학습의 첫 단계는 코드 작성 및 실행 환경을 구축하는 것이다. 본 문서는 리눅스(Ubuntu) 환경을 기준으로 x86-64 어셈블리 개발 툴체인을 셋업하고, "Hello World" 프로그램을 빌드하는 과정을 정리한다.

1. 리눅스 환경의 필요성

윈도우 환경(MASM 등)과 달리 리눅스 환경은 시스템 콜(System Call)의 호출 규약이 직관적이며, GDB와 같은 디버깅 도구를 기본적으로 제공한다.
보안 분석 실무에서도 리눅스 바이너리 분석 비중이 높으므로 초기 학습 환경으로 적합하다.
나는 WSL2를 이용해 우분투 환경을 구축해서 사용했다.

2. 필수 도구 설치

빌드와 디버깅을 위해 다음 3가지 도구가 필요하다.

  • NASM(Netwide Assembler): .asm 소스 코드를 기계어(.o)로 변환하는 어셈블러.
  • GCC(GNU Compiler Collection): 링킹(ld) 과정을 간편하게 처리하기 위해 사용.
  • GDB(GNU Debugger): 레지스터 상태와 메모리를 확인하기 위한 디버거.
sudo apt update
sudo apt install nasm gcc gdb -y

3. Hello World 작성

C언어의 printf 라이브러리를 사용하지 않고, 커널의 시스템 콜을 직접 호출하여 문자열을 출력한다.

hello.asm

section .data
    msg db "Hello, Assembly!", 0x0a  ; 출력할 문자열 (\n 포함)

section .text
    global _start                    ; 진입점(Entry Point)

_start:
    ; 1. write(1, msg, 17)
    mov rax, 1                       ; sys_write
    mov rdi, 1                       ; stdout
    mov rsi, msg                     ; 버퍼 주소
    mov rdx, 17                      ; 길이
    syscall                          ; 커널 호출

    ; 2. exit(0)
    mov rax, 60                      ; sys_exit
    mov rdi, 0                       ; 종료 코드
    syscall

4. 빌드 및 실행

소스 코드를 실행 파일로 만드는 과정은 어셈블(Assemble)링킹(Linking) 두 단계로 나뉜다.

  1. 어셈블: 소스 코드를 오브젝트 파일로 변환한다.

    nasm -f elf64 hello.asm -o hello.o
    

    -f elf64 옵션을 통해 64비트 ELF 포맷임을 명시해야 한다.

  2. 링킹: 실행 파일을 생성한다.

    ld hello.o -o hello
    

    참고: 실무 프로젝트에서는 매번 명령어를 입력하지 않고 Makefile이나 CMake 같은 빌드 자동화 도구를 사용하여 이 과정을 관리한다.

  3. 실행:

    ./hello
    

이 과정을 통해 고수준 언어(High-Level Language)가 감추고 있던 시스템의 로우 레벨 동작 방식을 이해할 수 있다.